home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d927.lha / Telnet / src / terminal.c < prev    next >
C/C++ Source or Header  |  1993-10-07  |  3KB  |  151 lines

  1. /*
  2.  * Copyright (c) 1988, 1990 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted provided
  6.  * that: (1) source distributions retain this entire copyright notice and
  7.  * comment, and (2) distributions including binaries display the following
  8.  * acknowledgement:  ``This product includes software developed by the
  9.  * University of California, Berkeley and its contributors'' in the
  10.  * documentation or other materials provided with the distribution and in
  11.  * all advertising materials mentioning features or use of this software.
  12.  * Neither the name of the University nor the names of its contributors may
  13.  * be used to endorse or promote products derived from this software without
  14.  * specific prior written permission.
  15.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  16.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  17.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  */
  19.  
  20. #ifndef lint
  21. static char sccsid[] = "@(#)terminal.c    5.1 (Berkeley) 9/14/90";
  22. #endif /* not lint */
  23.  
  24. #include <arpa/telnet.h>
  25. #include <sys/types.h>
  26.  
  27. #include "ring.h"
  28.  
  29. #include "externs.h"
  30. #include "types.h"
  31.  
  32. Ring    ttyoring, ttyiring;
  33. char    ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];
  34.  
  35. int termdata;            /* Debugging flag */
  36.  
  37. cc_t termForw2Char;
  38. cc_t termAytChar;
  39.  
  40. /*
  41.  * initialize the terminal data structures.
  42.  */
  43.  
  44. init_terminal()
  45. {
  46.     if (ring_init(&ttyoring, ttyobuf, sizeof ttyobuf) != 1) {
  47.     exit(1);
  48.     }
  49.     if (ring_init(&ttyiring, ttyibuf, sizeof ttyibuf) != 1) {
  50.     exit(1);
  51.     }
  52.     autoflush = TerminalAutoFlush();
  53. }
  54.  
  55.  
  56. /*
  57.  *        Send as much data as possible to the terminal.
  58.  *
  59.  *        Return value:
  60.  *            -1: No useful work done, data waiting to go out.
  61.  *             0: No data was waiting, so nothing was done.
  62.  *             1: All waiting data was written out.
  63.  *             n: All data - n was written out.
  64.  */
  65.  
  66.  
  67. int
  68. ttyflush(drop)
  69. int drop;
  70. {
  71.     register int n, n0, n1;
  72.  
  73.     n0 = ring_full_count(&ttyoring);
  74.     if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) {
  75.     if (drop) {
  76.         TerminalFlushOutput();
  77.         /* we leave 'n' alone! */
  78.     } else {
  79.         n = TerminalWrite(ttyoring.consume, n);
  80.     }
  81.     }
  82.     if (n > 0) {
  83.     if (termdata && n) {
  84.         Dump('>', ttyoring.consume, n);
  85.     }
  86.     /*
  87.      * If we wrote everything, and the full count is
  88.      * larger than what we wrote, then write the
  89.      * rest of the buffer.
  90.      */
  91.     if (n1 == n && n0 > n) {
  92.         n1 = n0 - n;
  93.         if (!drop)
  94.             n1 = TerminalWrite(ttyoring.bottom, n1);
  95.         n += n1;
  96.     }
  97.     ring_consumed(&ttyoring, n);
  98.     }
  99.     if (n < 0)
  100.     return -1;
  101.     if (n == n0) {
  102.     if (n0)
  103.         return -1;
  104.     return 0;
  105.     }
  106.     return n0 - n + 1;
  107. }
  108.  
  109.  
  110. /*
  111.  * These routines decides on what the mode should be (based on the values
  112.  * of various global variables).
  113.  */
  114.  
  115.  
  116. int
  117. getconnmode()
  118. {
  119.     extern int linemode;
  120.     int mode = 0;
  121.  
  122.     if (my_want_state_is_dont(TELOPT_ECHO))
  123.     mode |= MODE_ECHO;
  124.  
  125.     if (localflow)
  126.     mode |= MODE_FLOW;
  127.  
  128.     if (my_want_state_is_will(TELOPT_BINARY))
  129.     mode |= MODE_INBIN;
  130.  
  131.     if (his_want_state_is_will(TELOPT_BINARY))
  132.     mode |= MODE_OUTBIN;
  133.  
  134.     if (my_want_state_is_will(TELOPT_LINEMODE))
  135.     mode |= linemode;
  136.     return(mode);
  137. }
  138.  
  139. void
  140. setconnmode(force)
  141. {
  142.     TerminalNewMode(getconnmode()|(force?MODE_FORCE:0));
  143. }
  144.  
  145.  
  146. void
  147. setcommandmode()
  148. {
  149.     TerminalNewMode(-1);
  150. }
  151.